package lc.q151_200;

import java.util.HashMap;
import java.util.Map;

/**
 * 颠倒给定的 32 位无符号整数的二进制位。
 */
public class Q190 {

    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        // 分成八组
        int n0 = n & 0x000000F;
        int n1 = (n >>> 4) & 0x0000000F;
        int n2 = (n >>> 8) & 0x0000000F;
        int n3 = (n >>> 12) & 0x0000000F;
        int n4 = (n >>> 16) & 0x0000000F;
        int n5 = (n >>> 20) & 0x0000000F;
        int n6 = (n >>> 24) & 0x0000000F;
        int n7 = (n >>> 28) & 0x0000000F;
        // 写一个映射表
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        map.put(0,0);
        map.put(1, 8);
        map.put(2, 4);
        map.put(3, 12);
        map.put(4, 2);
        map.put(5, 10);
        map.put(6, 6);
        map.put(7,14);
        map.put(8, 1);
        map.put(9, 9);
        map.put(10,5);
        map.put(11, 13);
        map.put(12, 3);
        map.put(13, 11);
        map.put(14, 7);
        map.put(15, 15);
        int k0 = map.get(n0);
        int k1 = map.get(n1);
        int k2 = map.get(n2);
        int k3= map.get(n3);
        int k4 = map.get(n4);
        int k5 = map.get(n5);
        int k6 = map.get(n6);
        int k7 = map.get(n7);
        // 拼起来

        return (k0 << 28) | (k1 << 24) | (k2 << 20) | (k3 <<16) | (k4 << 12) | (k5 << 8) | (k6 << 4) | k7;
    }

    public static void main(String[] args) {
        int i = new Q190().reverseBits(0b11111111111111111111111111111101);
        System.out.println(i);
    }
}
